/**
 * 测试对象顶点着色器
 * 用于开发和调试着色器效果
 * 实现顶点扭曲效果（基于 Perlin 噪声）
 */

// 引入 Perlin 噪声函数
#include "/node_modules/lygia/generative/cnoise.glsl"

// Shadertoy 风格的 uniform
uniform float iTime;        // 经过的时间
uniform vec3 iResolution;   // 视口分辨率
uniform vec4 iMouse;        // 鼠标位置

// 传递给片元着色器的变量
varying vec2 vUv;           // UV 纹理坐标

// 自定义 uniform
uniform float uDistort;     // 扭曲强度

/**
 * 顶点扭曲函数
 * 使用 Perlin 噪声沿法线方向移动顶点
 * @param p - 顶点位置
 * @return 扭曲后的位置
 */
vec3 distort(vec3 p){
    // 生成基于位置和时间的噪声
    float noise=cnoise(p+iTime);
    // 沿法线方向移动顶点
    p+=noise*normal*.3*uDistort;
    return p;
}

void main(){
    // 获取顶点位置
    vec3 p=position;
    // 应用扭曲
    p=distort(p);
    // 标准 MVP 变换
    gl_Position=projectionMatrix*modelViewMatrix*vec4(p,1.);
    
    // 传递 UV 坐标
    vUv=uv;
}